package com.java.yz.day16;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

//通过反射获取成员方法并使用
/*
    获取所有方法
		getMethods
		getDeclaredMethods
    获取单个方法
        getMethod
        getDeclaredMethod
    暴力访问
        method.setAccessible(true);

 */
public class ReflexDemo4 {
    public static void main(String[] args) throws Exception{
        Class<?> aClass = Class.forName("com.java.yz.day16.Student");

        //访问的是所有公共的方法，包括父类的
//        Method[] methods = aClass.getMethods();
//        for (Method method : methods) {
//            System.out.println(method);
//        }

        //访问的是所有Student的方法,包括私有的
//        Method[] declaredMethods = aClass.getDeclaredMethods();
//        for (Method declaredMethod : declaredMethods) {
//            System.out.println(declaredMethod);
//        }

        Constructor<?> constructor = aClass.getConstructor();
        Object o = constructor.newInstance();

        //获取单个公共的成员方法
//        Method method = aClass.getMethod("fun2");
        //object invoke(Object obj,Object. . . args)
        //在具有指定参数的 方法对象上调用此方法对象表示的底层方法。
//        method.invoke(o);

        //获取带参数的公共的成员方法
//        Method declaredMethod = aClass.getDeclaredMethod("fun2", Boolean.class);   //这里传需要传入参数的类型
//        declaredMethod.invoke(o,true);  //如果有返回值传一个对应的返回值

        Method declaredMethod = aClass.getDeclaredMethod("fun1", String.class);
        //如果是私有的，加一个暴力访问就可以访问了
        declaredMethod.setAccessible(true);
        declaredMethod.invoke(o,"你好");


    }
}
